package framework.director;

import framework.bean.NeedScanPackageBean;
import framework.file.scan.FileScan;
import framework.util.ClassReflectUtil;
import framework.util.FileUtil;
import test.util.Test;

import java.io.File;
import java.util.List;

/**
 * @author 马洁
 * @date 2020/3/11 - 14:26
 */
public abstract class BaseDirector {
    private NeedScanPackageBean needScanPackageBean;

    public BaseDirector(NeedScanPackageBean needScanPackageBean) {
        this.needScanPackageBean = needScanPackageBean;
    }

    /**
     * 需要对类做的事情, 比如进行依赖注入, 注解检查等
     *
     * @param cls 需要检查的类
     */
    protected abstract void needDoForClass(Class<?> cls);

    /**
     * 启动项目, 接收请求
     *
     * @param reqUrl 请求参数
     */
    public abstract void start(String reqUrl);

    /**
     * 对于所有的文件都进行一些操作
     */
    synchronized
    public void init() {
        for (File fileName : getClassFileList()) {
            needDoForClass(reflectGetClass(convertPathToPackage(fileName.getPath())));
        }
    }

    /**
     * 将 src/main/java/com/my/controller 这样的字符串转变为 只有包名的
     * com.my.controller
     *
     * @param fileName 需要转变的路径名
     * @return 包名
     */
    protected String convertPathToPackage(String fileName) {

        final String pointStrRegForm = "[.]";

        return FileUtil.getUnixStr(fileName)
                .split(needScanPackageBean.getModelName())[1]
                .split(pointStrRegForm)[0]
                .replace("/", ".");
    }

    /**
     * 根据字符串反射获得类
     *
     * @param cls 需要获得的类
     * @return 类
     */
    protected Class<?> reflectGetClass(String cls) {
        return ClassReflectUtil.reflectGetClass(cls);
    }

    private List<File> getClassFileList() {
        List<File> fileScan = new FileScan(needScanPackageBean).startScan();

        Test.p("fileScan = " + fileScan);
        return new FileScan(needScanPackageBean).startScan();
    }
}
